package sf.querydsl;

import com.querydsl.core.types.Predicate;
import com.querydsl.sql.AbstractSQLQuery;
import com.querydsl.sql.Configuration;
import com.querydsl.sql.dml.SQLDeleteClause;
import com.querydsl.sql.dml.SQLInsertClause;
import com.querydsl.sql.dml.SQLMergeClause;
import com.querydsl.sql.dml.SQLUpdateClause;
import sf.common.wrapper.Page;
import sf.core.DBObject;
import sf.database.jdbc.sql.OrmIterator;
import sf.database.jdbc.sql.OrmStream;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

/**
 * querydsl基础操作类
 */
public interface QueryDSLInf {
    /**
     * QueryDSL支持，返回QueryDSL的Configuration，可以使用QueryDSL进行数据库操作.
     * @param conn
     * @param tableClass 返回类型,主要是注册自定义类型.
     * @return SQLQuery
     * @see com.querydsl.sql.SQLQuery
     */
    Configuration queryDSLConfiguration(Connection conn, Class<? extends DBObject>... tableClass);

    /**
     * 是否存在该对象
     * @param conn
     * @param predicates
     * @param clz
     * @param <T>
     * @return
     */
    <T extends DBObject> boolean queryDSLExists(Connection conn, List<Predicate> predicates, Class<T> clz);

    /**
     * @param conn
     * @param query
     * @param returnClass 返回类型
     * @param <T>
     * @return
     * @
     */
    <T> List<T> queryDSLSelectList(Connection conn, AbstractSQLQuery<?, ?> query, Class<T> returnClass);

    /**
     * sqlserver2000分页有问题
     * @param conn
     * @param query
     * @param returnClass 返回类型
     * @param start       必须为数字(<0,将忽略该参数)
     * @param limit       必须为>=0的数字
     * @param <T>
     * @return
     * @
     */
    <T> Page<T> queryDSLSelectPage(Connection conn, AbstractSQLQuery<?, ?> query, Class<T> returnClass, long start, int limit);

    /**
     * 查询单一值
     * @param conn
     * @param query
     * @param returnClass 返回类型
     * @param <T>
     * @return
     * @
     */
    <T> T queryDSLSelectOne(Connection conn, AbstractSQLQuery<?, ?> query, Class<T> returnClass);

    /**
     * 迭代查询
     * @param conn
     * @param ormIt
     * @param query
     * @param returnClass
     * @param <T>
     */
    <T> void selectIterator(Connection conn, OrmIterator<T> ormIt, AbstractSQLQuery<?, ?> query, Class<T> returnClass);

    /**
     * 流式返回值
     * @param conn
     * @param ormStream
     * @param query
     * @param returnClass
     * @param <T>
     */
    <T> void selectStream(Connection conn, OrmStream<T> ormStream, AbstractSQLQuery<?, ?> query, Class<T> returnClass);

    /**
     * 插入
     * @param conn
     * @param insert
     * @return
     * @
     */
    int queryDSLInsert(Connection conn, SQLInsertClause insert);

    /**
     * 带返回值
     * @param conn
     * @param insert
     * @param keyValues
     * @return
     */
    int queryDSLInsert(Connection conn, SQLInsertClause insert, List<Map<String, Object>> keyValues);

    /**
     * @param conn
     * @param update
     * @return
     * @
     */
    int queryDSLUpdate(Connection conn, SQLUpdateClause update);

    /**
     * @param conn
     * @param delete
     * @return
     * @
     */
    int queryDSLDelete(Connection conn, SQLDeleteClause delete);

    /**
     * @param conn
     * @param merge
     * @return
     * @
     */
    int queryDSLMerge(Connection conn, SQLMergeClause merge);

    /**
     * 带返回值
     * @param conn
     * @param merge
     * @param keyValues
     * @return
     */
    int queryDSLMerge(Connection conn, SQLMergeClause merge, List<Map<String, Object>> keyValues);
}
